package com.example.web.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 
 * 对ioc有一定的理解
 * ioc 底层 是通过bean工厂、注册接口、和bean定义来创建bean实例的。
 * 所以java类交给spring管理，需要注册
 * 这里实现的ApplicationContextAware
 * 
 * @author yzl
 *
 */
@Component
public class ApplicationContextRegister implements ApplicationContextAware{

	  private static ApplicationContext applicationContext;
	  
	    @Override
	    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
	        if(ApplicationContextRegister.applicationContext == null) {
	        	ApplicationContextRegister.applicationContext = applicationContext;
	        }
	    }
	 
	    /**
	     * 获取applicationContext
	     */
	    public static ApplicationContext getApplicationContext() {
	        return applicationContext;
	    }
	 
	    /**
	     *通过name获取 Bean.
	     * @param name
	     * @return
	     */
	    public static Object getBean(String name){
	        return getApplicationContext().getBean(name);
	    }
	 
	    /**
	     * 通过class获取Bean.
	     * @param clazz
	     * @param <T>
	     * @return
	     */
	    public static <T> T getBean(Class<T> clazz){
	        return getApplicationContext().getBean(clazz);
	    }
	 
	    /**
	     * 通过name,以及Clazz返回指定的Bean
	     * @param name
	     * @param clazz
	     * @param <T>
	     * @return
	     */
	    public static <T> T getBean(String name,Class<T> clazz){
	        return getApplicationContext().getBean(name, clazz);
	    }

}
